home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / c / sozobon / sozbin15.zoo / sozdistr / doc / binary.doc / hcc.chg < prev    next >
Encoding:
Text File  |  1995-10-01  |  36.3 KB  |  858 lines

  1. hcc 2.00 eXtended Version
  2. known bugs not fixed:
  3. ----------------------------------
  4.  
  5.     char chr;
  6.     ...
  7.     test(chr = 1)
  8. compiles to:
  9.     (move.w #1, <chr>)
  10. what maybe will overwrite another variable or cause an exception:
  11.    address error (if <chr> is not even)
  12.  
  13. ----------------------------------
  14.  
  15.  
  16.    assignment from pointer to integer value produces error
  17.      "pointer not allowed". Shouldn'd it work? Example:
  18.      char *p, *fun();
  19.      int i;
  20.      i = p;        /* "error: pointer not allowed" */
  21.      i = fun();        /* "error: pointer not allowed" */
  22.  
  23. ----------------------------------
  24. last modifications - by Volker Seebode - 
  25. version/patchlevel x35
  26. Sun Sep 16 1995
  27.  
  28.     - fixed initialization/decl of auto arrays w/o nbr of elements like
  29.       char text[] = "Hello";
  30.     - cdecl was not parsed (and thrown away) -> fixed
  31.     - no more warnings "incompatible pointer type" when passing (void *) pointers as args
  32.     - superfluous ';' during local decls are skipped now
  33.     - -W-PUN switch for "undef undefined" warning
  34.  
  35. version/patchlevel x34
  36. Tue Aug 29 1995
  37.  
  38.     - "volatile" and "const" weren't parsed inside struct/enum - fixed
  39.     - "volatile" and "const" weren't parsed inside casts - fixed
  40.     - var or parm decl like "char * const * p" weren't parsed - fixed
  41.     WARNING: "volatile" and "const" are parsed only without any effekt
  42.     - bus error occured after message
  43.  "arg N: passing int from pointer lacks a cast (loosing significant bits) for"
  44.        (pointer arg passed by integer with size < 4) - fixed
  45.      - passing int for proto short caused a bus error using long ints
  46.        ("hcc -L" or "cc -mlong" respectively) - fixed
  47.      - __STDC__ was not internally defined, now it is
  48.      - the "#pragma" option "PTY" didn't work - fixed
  49.      - include file names aren't made lowercase any more
  50.      - switch labels with long switch vars got overwriten by an sprintf() - fixed
  51.      - error messages reflecting prototypes now include
  52.        file and line of prototype declaration
  53.      - prototype/arg checking now works on structures too     
  54.      - new flag "-F[no]-size-t-long" setting the type returned by the sizeof
  55.        operator to "unsigned long" (default: unsigned int).
  56.        WARNING: you need TOP pl>24 and a special lib (called libct.a)
  57.        to use this option!
  58.      - int default parms not explicit declared ( fun(intparm){ ... } )
  59.        got storage class extern -> fixed
  60.      - bug in general code generation function `_addcode()' fixed
  61.      - '#' statements inside the false branch of an '#if'-statement were processed
  62.        anywhere on a line, even inside comments -> fixed
  63.      - added warning for static function definition following non static decl
  64.     
  65. last modifications - by Volker Seebode - 
  66. version/patchlevel x33
  67. Wed Aug 1 1995
  68.  
  69.     function prototypes implemented.
  70.     New options:
  71.      -F[no-]proto: [don't] use prototypes for type checking, also
  72.       accessible via `#pragma PTY'.
  73.       default: use prototypes.
  74.      -WNPR: complain call of functions w/o prototype, also accessible via
  75.       `#pragma NPR'. If prototyping is disabled, -WNPR is set to false.
  76.       default: don't warn if call to function w/o prototype is detected.
  77.     `__STDC__' is internally defined with value 0 if prototype checking is ON
  78.     variables are distinguished from macros with same name, for example:
  79.         #define key(a)    ((a)*4)
  80.         int key;
  81.       works. `key' is handled as macro only if there are argument(s) following, else
  82.       it references the var `key'.
  83.  
  84. version/patchlevel x32
  85. Sat Jun 24 1995
  86.  
  87.     const expressions were not unfolded completely. That's why complex macros
  88.         couldn't be calculated during expansion and produced the error
  89.         message "bad INIT expression". Fixed
  90.     code for auto struct/union/array initialization was missing, added
  91.     bitfield initialization was broken, fixed
  92.     bug in assignment from signed bitfields fixed
  93.     casted pointers with postinc/postdec are accepted now and handled correctly
  94.     the `?' Operator didn't work on pointers and double vars, fixed
  95.     test of double vars (e.g. "if (double_var)") was broken, fixed
  96.     assignement in function parameter passing didn't work with double vars, fixed
  97.     ' inside comments and excluded lines was processed for character constants
  98.         (error "char-const overflow"), fixed
  99.     /* inside comment is complained if nested comments are disabled
  100.     changed -f option to -F
  101.  
  102. last modification - by jerry geiger - 
  103. version/patchlevel x31
  104. APR 26 1995
  105.  
  106.     bug in out-file-name generation fixed
  107.     bug with func decls in structures fixed
  108.     new cml/pragma option -IFD (implicit decl fun)
  109.  
  110. PL 30
  111.     func decls without IDs should work now everywhere
  112. PL 29
  113.     function pointers are handled like function names now always
  114.         and in every context like: v = x->y.z(args);
  115.     no more limits to define '-D' options in commandline
  116.     warnings if undefining an undefined macro
  117.  
  118. version/patchlevel x28
  119. MAR 26 1995
  120.     - debug symbols changed (generated with -X option)
  121.     - less memory when including header files
  122.  
  123. last modifications - by Volker Seebode - 
  124. version/patchlevel x27
  125. Sun Jan 15 1995
  126.     - the flags '-fdouble-reg-vars', '-ffloat-args' and
  127.       '-fframe-relative' were handled inverted -> fixed.
  128.     - detection of alloca() was buggy: any function name beginning with
  129.       'alloca' triggered A6-relative restoring of regs.
  130.  
  131. version/patchlevel x26
  132. Sat Dec 24 1994
  133.     changed code generation for switch tables (compiled with -DLABELDIFF):
  134.     '.dc.w Lxxx' -> '.dc.w Lxxx-Lyyy'.
  135.     
  136.     WARNING: you need TOP Patchlevel >= #21 and JAS Patchlevel >= #10
  137.              for this version of HCC!
  138.     
  139. version/patchlevel x25
  140. Mon Nov 07 1994
  141.  
  142.     floating point:
  143.     - fixed inherit()/rinherit() to copy double val
  144.     - new options:
  145.     -fdouble-reg-vars: put register double vars into regs if possible
  146.                         (default: ON)
  147.     -ffloat-args:    pass float args as floats (default: OFF)
  148.     -fframe-relative:restore regs A6 relative (default: OFF)
  149.         Specifying this option works for all inputfiles.
  150.         It is also activated for the next (or current) function,
  151.         if a call to alloca() is detected or
  152.         by the #pragma-statement "FRL".
  153.     
  154.     These flags may be inverted by inserting "no-",
  155.             WARNING: you need TOP Patchlevel >= #22 to use this option!
  156.     e.g. -fno-double-reg-vars.
  157.  
  158. version/patchlevel x24
  159. Mon Oct 03 1994
  160.  
  161.     floating point:
  162.     - implemented IEEE double precision with 64 bit
  163.  
  164.     - added exit code for functions changing the stack pointer
  165.       (by calling alloca()...) to make register variables possible.
  166.  
  167.     WARNING: you must have TOP Patchlevel >= #19 to use these features!
  168.  
  169. version/patchlevel x23
  170. Sun Sep 25 1994
  171.  
  172.     bitfields:
  173.     - changed code generation
  174.     - long bitfields implemented ( unsigned long foo : 25; )
  175.     - default order reversed (first bit = MSB)
  176.  
  177.  
  178. last modifications - by jerry g geiger - 
  179.  
  180. version/patchlevel x22
  181. Thu Sep 22 1994
  182.  
  183.     adding something to a void * pointer will generate an error message
  184.     now - better than causing an exception during runtime ;-)
  185.  
  186.     comparing an unsigned to a signed value will cause a warning
  187.         unless switched off by -W-CUS
  188.  
  189.     adding something to a void * pointer will cause a warning, cause
  190.         actually nothing is added (void has length 0!)
  191.  
  192.  
  193. version/patchlevel x21
  194. Sep 15 1994
  195.  
  196.     bug with mixing up 'lsr' and 'asr' instructions and unsigned
  197.     shorts and shorts fixed.
  198.  
  199. version/patchlevel x20
  200. Sep 09 1994
  201.     longs in switch/case should be handled correctly now.
  202.     $ACE environment variable forces hcc to use handle -1 for stderr
  203.         (cause ACE can't handle such things)
  204.     __GDATE__ and __SDATE__ macros fixed.
  205.     a bug occuring with pointer addition/sub sometimes fixed
  206.          (resulting in a 'asr.w' instruction instead of 'asr.l') 
  207.  
  208. version x19
  209. Jul 29 1994
  210.     especially for Holger :
  211.     you can switch off the bad return value/type warnings now
  212.     -W-BRV / #pragma -BRV
  213.  
  214.     the commandline syntax changed a little bit
  215.     (see man file or 'hcc -h')
  216.  
  217. version x17
  218. Jul 04 1994
  219.     bug fixed:
  220.        auto cast of negative short constants to long
  221.  
  222. Jun 13 1994
  223.     the meaning of $INCLUDEDIR changed a little bit:
  224.         it replaces now the built in pathes with
  225.         '${INCLUDEDIR}\sozobonx' and $INCLUDEDIR
  226.     &array is allowed for type checking now
  227.     calling a function via pointer (*func)() should work with
  228.      func(); now, too
  229.     buildin macros changed according to standard
  230.     accepts '/' in include pathes
  231.     ipc'ed files' timestamps are tested now, the newer one is included
  232.     diagnostic output is always written to stderr now
  233.     a man file exists now
  234.     some minor bugs fixed
  235.     $SOZOBONCNF isn't recognized/supported any longer
  236.  
  237. version x15
  238. Apr 19 1994
  239.     #pragma option 'echo' built in:
  240.     '#pragma echo ...' will echo the rest of the line to stderr
  241.     
  242. bug fixes:
  243.     local enum declarations work now (no more bus errors)
  244.     missing #endif's are errors for TRUE #if's now, too
  245.     comparing to 0 should work under all circumstances now
  246.     (there was an error in cast routines)
  247.  
  248.     
  249. version x14
  250. Mar 15 1994    file date: March 23 1994
  251. integer constants:
  252.     should now handled as provided by ANSI:
  253.     Constants are never negativ (except ones prefixed by a '-')
  254.     Hex and octal constants are always unsigned.
  255.     Constants are of the smallest type they fit in.
  256.     
  257.  
  258. version x13
  259. Mon Mar 7 1994
  260.  
  261. integer constants:
  262.     cause stil some problems; a hexadecimal one with leading '0's as
  263.     '0x0000FFFF' is of type long now.
  264.     The handling of constants is still not as provided by ANSI standard.
  265.     Hex and octal constants are not unsigned by default.
  266.     Any constants may become negative, if they don't have a suffix 'U'!
  267.     This is an error, of course. I'll try to fix it.
  268.  
  269. new #pragma option:
  270.     #pragma [+|-]PMR
  271.     switch on/off warning 'probably missing return' 
  272.  
  273. changed macro:
  274.     SOZOBON 
  275.     It has the value of 0x200, as the originals' version number;
  276. new macros: 
  277.     __SOZOBONX__ 
  278.     Is defined for our eXtended version of Sozobon C compiler, it
  279.     will keep the version number of eXtended SOZOBON version as:
  280.     0x200 + our revision number (0x213 for current version).
  281.     __MSHORT__
  282.     Is TRUE if int is a 16 Bit value. (Undefined with -L option).
  283.  
  284. version x12
  285. Mon Feb 28 1994
  286. integer constants:
  287.     hex and octal constants tend to be unsigned now, a hexadecimal one,
  288.     with leading '0's as '0x0000FFFF' is of type long now.
  289.     There is still an error in handling of constants - sorry - comparing
  290.     of two constants can produce wrong code.
  291.  
  292. Arrays larger than 32K should be handled correctly now.
  293.  
  294. Environment:
  295.     SOZOBONCNF=
  296.     "standard": DATE in __DATE__ macro will be of format MM/DD/YY
  297.         else it it will be DD.MM.YY
  298.     "devconout": diagnostic output will not be written to STDERR/Gemdos
  299.         console handle but to BIOS console device
  300.  
  301. function handling:
  302.     A non void declarated function now will cause a warning, if there is
  303.     no return value specified; this works of course the other way round,
  304.     too. 
  305.     A warning will be generated, if hcc cannot decide wether the
  306.     specified return statements will return always some correct value.
  307.  
  308. Bugs fixed:
  309. A 'switch' without a case-block now won't force hcc to an exception
  310. any more. I hope so.
  311.  
  312.  
  313. version x11
  314. Sun Dec 19 1993
  315. Environment:
  316.     SOZOBONCNF=
  317.     List of comma seperated strings:
  318.     "standard" diagnostic output will not go to BIOS console device
  319.         handle but to STDERR/Gemdos console
  320.  
  321.     STDERR=
  322.     If this variable exists diaginstic output will go to Gemdos handle 2
  323.         and not to Gemdos console handle.
  324.  
  325. Macros:
  326.     new macro __CDATE__ implemented; it represents a date-string of the
  327.     format "Mon DD YYYY"
  328.  
  329. commandline Options:
  330.     -v: be verbose
  331.     -V: print complete Version info
  332.  
  333. Bugs fixed:
  334. The error when reading a function declaration like 
  335. 'int main( int argc, char *argv[])' is fixed. (The error was mixing up
  336. the type of array with the pointer's type.)
  337.  
  338. Bugs kept:
  339. A 'const' statement may still cause some trouble, so better '#undef const'
  340. in your source code.
  341.  
  342. ----
  343. Änderungen an HCC V2.0, modifizierte Version 2.00x10
  344. von Holger Weets (Atari(/Amiga)), Christian Wempe (Amiga(/Atari))
  345. und Detlef Wuerkner (Amiga(/Atari))
  346. Stand: 20.04.93
  347.  
  348.  
  349. Erstmal die schlechten Nachrichten:
  350.  
  351. An der Original Version 2.0 des Compilers hat sich praktisch kaum etwas ver-
  352. ändert, somit sind wir verantwortlich für alle Fehler, die mit der neuen
  353. Version auftreten, und mit der alten nicht. Natürlich können wir dafür aber
  354. nicht haftbar gemacht werden, die Benutzung erfolgt auf eigene Gefahr.
  355. Jeder Benutzer erkennt dies mit dem ersten Starten des Programmes an.
  356.  
  357. Folgende Fehler sind aktuell bekannt:
  358. -------------------------------------
  359. - funktion(char_variable = integer_konstante)
  360.         führt zu einer Zuweisung an <char_variable> auf Wortbreite (!),
  361.         was entweder in einem Adress-Fehler endet (3 Bomben) oder zu
  362.         einem (teilweisen) Überschreiben der nächsten Variablen
  363.  
  364. Und jetzt all die guten Nachrichten:
  365.  
  366.  
  367. Updates:
  368.    - x1 -> x2:
  369.       Option '-Q' eingebaut. Bewirkt, daß der Compiler schnelleren Code
  370.       erzeugt, auch wenn dieser das Programm länger macht.
  371.       Code-Erzeugung bei Struktur-Zuweisungen geändert:
  372.          - bei '-Q' erzeugt XCC max. 15 move's, ohne max. 3
  373.          - Erzeugung von move-Listen bei Strukturen, deren Länge nicht durch
  374.            4 teilbar ist, verbessert. Code ist hier jetzt schneller UND kürzer.
  375.  
  376.    - x2 -> x3:
  377.       Erzeugung von 'switches' wesentlich verbessert; der erzeugte Code ist
  378.       jetzt i.A. sowohl schneller als auch kürzer.
  379.  
  380.    - x3 -> x4:
  381.       - der Compiler teilt dem TOP jetzt mit, dass er die erweiterte Version
  382.         ist, und somit laeuft TOP jetzt auch mit anderen (alten) Versionen
  383.         des Compilers anstandslos zusammen
  384.       - neues 'pragma' Argument 'FST' schaltet die '-q' Option ein/aus
  385.       - neues 'pragma' Argument 'TOP' schaltet den TOP Funktionenweise ein/aus
  386.       - neues 'pragma' Argument 'OPT' uebergibt den nachfolgenden String an
  387.          TOP als neue Optionen
  388.       - Pointer-Vergleiche, bei denen ein 'viod *' beteiligt ist, liefern
  389.         jetzt keine Warnung des Compilers mehr
  390.       - Fehler beim scannen der CPP-Tokens behoben
  391.       - trap's werden nur noch generiert, wenn die Option '-L' nicht angegeben
  392.         wurde
  393.  
  394.    - x4 -> x5:
  395.       - es werden jetzt spezielle Sprungtabellen erzeugt, die nur halb so
  396.         lang sind, wie die alten; allerdings lassen sich so erzeugte
  397.         Assemblerfiles auch nur noch mit dem von mir modifizierten JAS V2.00x1
  398.         uebersetzen...
  399.  
  400.    - x5 -> x6:
  401.       - Float-Fehler aus V2.00x5 wieder ausgebaut...
  402.       - noch weiter optimiert
  403.       - mit der neusten Version des TOP übersetzt
  404.       - die includierten Files werden jetzt mit ausgegeben
  405.       - das String-Merging funktioniert jetzt auch im Zusammenhang mit
  406.         CPP-Konstanten, ist somit jetzt endlich vollständig implementiert
  407.       - C++ - Kommentarzeichen implementiert ('//', Kommentar bis Zeilen-
  408.         ende)
  409.       - wieder in HCC umbenannt, weil die veränderte Versionsnummer und
  410.         die Info-Zeile bereits eindeutig zeigt, daß es sich um eine
  411.         modifizierte Version des Compilers handelt (schliesslich haben wir
  412.         den Optimizer ja auch nicht umbenannt, obwohl wir den quasi neu-
  413.         geschrieben haben)
  414.  
  415.    - x6 -> x7:
  416.       - Option '-X' für Debugging implementiert (s.u.)
  417.       - aeusserst aergerlichen Fehler entfernt, der falsche movem - Anweisungen
  418.         bewirkte; solange mit TOP uebersetzt wurde, machte er sich nicht
  419.         bemerkbar, und auch ansonsten trat er nur in einem Spezialfall auf,
  420.         aber dann....
  421.       - hcc kann jetzt auch float's und double's wieder in Registern halten;
  422.         V1.21 konnte dies bereits, aber aus V2.00 scheint es ausgebaut
  423.         worden zu sein, ohne das es hierfuer einen Grund gibt...
  424.  
  425.    - x7 -> x8:
  426.       - optimiert
  427.       - es werden jetzt auch short's registert...
  428.       - "__TOS__" ist jetzt WIRKLICH vordefiniert
  429.       - bessere TOP-Unterstützung
  430.       - Fehler-Erholung bei CPP-Errors verbessert
  431.       - ST-Version: Stack groesser gemacht; fuer 'normale' Quelltexte
  432.         reichte der alte auch (ich habe damit noch nie Probleme gehabt),
  433.         aber es scheint auch Texte zu geben, die den hcc zu sehr tiefer
  434.         Rekursion zwingen und bei solchen ist er schon mal abgestuerzt.
  435.       - ST-Version: falls die Fehlermeldungen des Compilers auf den
  436.         Bildschirm ausgegeben werden, erscheinen sie jetzt auch wieder
  437.         untereinander (vorher wurde nur ein NL ausgegeben, was für
  438.         Dateien und C-Desk's Console Fenster auch reicht)
  439.       - es gibt ein neues Programm fuer das SOZOBON-System, den IPC
  440.         (Includefile PreCompiler), geschrieben von mir (Holger) und
  441.         portiert auf den Amiga von Christian (wem sonst ?) und mir
  442.         Dieses Programm wird von hcc jetzt unterstützt, d.h. beim
  443.         Laden von Includefiles wird zunächst das precompilierte gesucht,
  444.         und erst wenn dieses nicht gefunden wird, das "normale" File
  445.         gelesen. Der Vorteil dieser Methode ist natürlich, daß das
  446.         uebersetzen schneller geht, da precompilierte Dateien wesentlich
  447.         kuerzer sind und ausserdem "vorgekaut". Fuer Details siehe Datei
  448.         "IPC.TXT"
  449.       - beim Übersetzen der MiNT-Sources bemerkt: hcc brachte bei
  450.            "test(&main);"
  451.         eine Fehlermeldung. Das '&' vor dem Funktionsnamen ist völlig
  452.         überflüssig, aber nicht verboten. Jetzt kommt nur noch die
  453.         Warnung "& ignored".
  454.  
  455.    - x8 -> x9:
  456.       - der Compiler hat nicht bemerkt, wenn 'break' oder 'continue' an
  457.         illegalen Stellen verwendet wurden, stattdessen wurde dafür
  458.         'bra L-1' erzeugt, was weder top noch jas sehr witzig fanden
  459.       (06.11.92)
  460.       - die Anzahl der Fehler wird jetzt nur noch auf dem Bildschirm
  461.         ausgegeben, wenn -V angegeben wurde
  462.       - wenn die Fehlermeldungen in eine Datei geschrieben werden, und
  463.         -V angegeben wurde, dann werden sie zusätzlich auch noch auf den
  464.         Bildschirm ausgegeben; dies wurde vor allem deshalb implementiert,
  465.         weil sonst bei Erzeugung einer Fehlerdatei die Warnungen des
  466.         Compilers verlorengehen, da dieser richtigerweise nur dann einen
  467.         Exitcode != 0 liefert, wenn Fehler aufgetreten sind; wenn nur
  468.         Warnungen kamen, war/ist der Exitcode == 0 und niemand merkte
  469.         etwas vom Inhalt der Fehlerdatei
  470.       (19.03.93)
  471.       - falls -V nicht angegeben war und der hcc Fehler gefunden hat, so
  472.         wurde trotzdem 0 als ExitCode zurückgegeben, was natürlich nicht
  473.         im Sinne des Erfinders war.
  474.  
  475.    - x9 -> x10:
  476.       - Fehlermeldungen '? member ID' & 'select non struct' so um-
  477.         konstruiert, daß der nicht gefundene Identifier ausgegeben wird
  478.       - hcc kann jetzt ANSI-Funktionsköpfe lesen, d.h.
  479.             extern char *malloc(int size);
  480.         ist erlaubt, und
  481.             void main(int argc, char **argv, char *envp)
  482.             {
  483.             ...
  484.             }
  485.         auch (!!!).
  486.         Natürlich ist die K&R Schreibweise auch weiterhin erlaubt und wird
  487.         nicht (wie bei anderen Compilern) mit einer Warnung oder gar
  488.         Fehlermeldung bedacht.
  489.         Ebenfalls implementiert wurde der spezielle Bezeichner '...' als
  490.         (letzter) Funktionsparameter. Bedeutung: "hier können wahlweise
  491.         noch mehr Parameter kommen, müssen aber nicht, und eine Typüber-
  492.         prüfung soll ab hier auch nicht mehr stattfinden". Benutzt wird
  493.         soetwas etwa bei "fprintf(FILE *fp, char *fmt, ...)", also dort,
  494.         wo variabel viele Parameter kommen können.
  495.       - Schlüsselworte 'signed', 'cdecl', 'volatile', 'const' und 'pascal'
  496.         implementiert (wegen ANSI-Kompatibilität)
  497.             signed:     Speicherklasse; da alle Typen defaultmäßig signed
  498.                         sind, ist dieses Schlüsselwort nur für Casting
  499.                         und für den zukünftigen Typechecker interessant,
  500.                         ansonsten ist er mit 'int' gleichbedeutend.
  501.             cdecl:      Speicherklasse für Funktionen; Soll bedeuten, daß
  502.                         die Parameter auf dem Stack übergeben werden, und
  503.                         nicht in Registern (oder sonstwie); der hcc kann
  504.                         Parameter nur auf dem Stack übergeben, deshalb hat
  505.                         dieses Schlüsselwort aktuell keinen anderen Zweck,
  506.                         als die Übersetzbarkeit von ANSI-Sourcen zu gewähr-
  507.                         leisten.
  508.             pascal:     Speicherklasse für Funktionen; Soll bedeuten, daß
  509.                         die Parameter "falsch herum" auf dem Stack liegen
  510.                         und das diese Funktion den Stack selber aufräumt;
  511.                         Beides geschieht aktuell nicht, das noch kein
  512.                         Prototyping implementiert wurde. Aktuell hat dieses
  513.                         Schlüsselwort nur den Zweck, die Übersetzbakeit von
  514.                         ANSI-Sources zu gewährleisten.
  515.             volatile:   Speicherklasse für lokale Variablen;
  516.                         Soll bedeuten, daß diese Variable nicht in ein
  517.                         Register gelegt werden darf;
  518.                         der hcc legt nur Variablen in Register, die auch
  519.                         mit "register" gekennzeichnet sind, dieses
  520.                         Schlüsselwort hat also aktuell keinen anderen
  521.                         Zweck, als die Übersetzbarkeit von ANSI-Sourcen
  522.                         zu gewährleisten.
  523.             const:      Speicherklasse für Variablen; bedeutet, das die
  524.                         so gekennzeichneten Variablen nur gelesen, jedoch
  525.                         niemals überschrieben werden;
  526.                         wird ignoriert, bis ich die unübersichtliche NODE
  527.                         Struktur vollständig verstanden habe und sie auch
  528.                         ganz überblicken kann, dieses Schlüsselwort hat
  529.                         also aktuell keinen anderen Zweck, als die Über-
  530.                         setzbarkeit von ANSI-Sourcen zu gewährleisten.
  531.  
  532.         ACHTUNG: weil sich hierdurch die Menge der Schlüsselwörter geändert
  533.                  hat, ist es notwendig, daß alle precompilierten Header-
  534.                  Files mit der neuen Version des IPC übersetzt werden!
  535.  
  536.  
  537. Geschwindigkeits-Vergleich:
  538. ---------------------------
  539. Compiler    Computer             Dhrystones (V1.1/REGS)  Prg.-Länge
  540. ====================================================================
  541. DR-C        Mega-ST, TOS 1.04    862                     12905 Bytes  (*)
  542. SOZOBON-C   Amiga    AMIGADOS    1428                    5200  Bytes  (##)
  543. TC (2.0)    Mega-ST, TOS 1.04    1562                    10648 Bytes  (**)
  544. PC          Mega-ST, TOS 1.04    1562                    12332 Bytes  (x)
  545. SOZOBON-C   Mega-ST, TOS 1.04    1612                    4121  Bytes  (#)
  546. PC          Mega-ST, TOS 1.04    1724                    12234 Bytes  (**)
  547. (#)  : es wurden XCC V2.00x6 & TOP V2.00x6 & XDLibs verwendet
  548. (##) : gleicher Compiler & Optimizer, bloß auf dem Amiga (Länge ungefähr)
  549. (*)  : lag als ausführbare Datei dem Quelltext bei, ist also nicht nachprüfbar
  550.        (wir haben den Compiler nicht)
  551. (**) : von einem Bekannten (Carsten) gemacht (-> Ergebnis sicher)
  552. (x)  : mit 'cdecl' gemacht, also "wirklicher" Code-Erzeugungs-Vergleich...
  553.  
  554. Der Dhrystone-Quelltext kann bei uns bezogen werden (lief auch schon
  555. auf 'ner Cray...).
  556.  
  557. Diese Werte sind nur dazu gedacht, um daß weitverbreitete Vorurteil abzubauen,
  558. daß PD-Compiler langsam und schlecht sind, und außerdem viel zu langen Code
  559. erzeugen (man beachte die Programm-Längen...)
  560.  
  561. Noch ein Beispiel dazu:
  562. Der Frank hat kürzlich (mal wieder) ein Apfelmännchen-Programm geschrieben,
  563. natürlich mit SOZOBON-C. Die getestete Version brauchte 2 min. 14 sec für
  564. die komplette Grafik und war 23 KB lang. Bei einem Bekannten (Carsten)
  565. ließen wir das gleiche Programm unter TC compilieren. Das Ergebnis war, daß
  566. die Version 7 KB länger wurde, und trotz Mathe-Coprozessor 3 min 34 sec für
  567. die gleiche Berechnung benötigte, also über eine Minute länger rechnete ...
  568.  
  569. Da die Leute von SOZOBON endlich mit der Version 2.0 des Compilers heraus-
  570. gekommen sind, mußten wir unsere Erweiterungen/Fehlerbereinigungen natürlich
  571. sofort in diese Version einbauen.
  572. Anscheinend ist der Support für den Amiga inzwischen besser, als der für den
  573. Atari, denn obwohl SOZOBON-C für den ST geschrieben ist, haben wir diese
  574. Version vom Amiga bekommen und auf den ST zurück-angepasst, weil anscheinend
  575. keiner was von einer ATARI-Version 2.00 weiß ...
  576.  
  577. (falls Herr Würkner (alias TETISOFT) jetzt diese Zeilen liest:
  578. ^!$%§%#??
  579. ... und beim nächsten Mal benutzen wir dann '#ifdef FOR_AMIGA' an ALLEN
  580. Stellen, die nur für den Amiga geändert wurden!...)
  581.  
  582. Die von uns modifizierte Version des Compilers trägt den Namen XCC
  583. (eXtended C-Compiler) und die Versions-Nummer 2.00x6 (nur 'x6' hinzugefügt)
  584.  
  585.  
  586. DIVERSES:
  587. ---------
  588. - Es wurde einiges optimiert, ent-rekursioniert und entwanzt
  589.  
  590. - Wenn das Datei-Ende innerhalb eines Kommentars lag, so endete dies in einer
  591.   Endlosschleife des Compilers - behoben
  592.  
  593. - Wenn das Datei-Ende innerhalb eines #if/#ifdef/#ifndef lag, so führte
  594.   dies ebenfalls zu einer Endlosschleife, falls die Bedingung falsch war
  595.   bzw. der #else - Zweig erreicht war. Dies wird jetzt mit einer Fehler-
  596.   meldung quittiert.
  597.  
  598. - die Meldung 'lost X nodes' kommt jetzt seltener (gar nicht mehr ?)
  599.  
  600. - Die Hex-Notation in String-Konstanten funktioniert jetzt auch richtig...
  601.  
  602. - so etwas wie 'printf("Umlaut-Test: äöüÖÄÜß\n")' funktioniert jetzt endlich
  603.   Umlaute im Quelltext werden jedoch auch weiterhin als White-Space
  604.   interpretiert.
  605.  
  606. - der Compiler stürzt nicht mehr ab, wenn jemand lokale Arrays bei der
  607.   Deklaration gleich initialisieren wollte.
  608.  
  609. - wenn der Compiler auf ein Statement der Form 'if ()' (also ohne was in den
  610.   Klammern) traf, dann stuerzte er ab -- behoben
  611.  
  612. - wenn die geschweifte Klammerung bei 'do {....} while();' fehlerhaft ist,
  613.   dann stuerzte der Compiler manchmal ab -- behoben
  614.  
  615. - bisher pasierte es manchmal, daß HCC/XCC falscherweise die Fehlermeldung
  616.   'struct redefined ...' ausgab. Dies lag daran, daß bei unbenannten
  617.   Strukturen/Union's intern eigene Namen vergeben werden, und diese
  618.   auffrund eines Denkfehlers nicht immer eindeutig waren, der Compiler
  619.   also den selben Namen an zwei Strukturen vergeben hat. Dieser Fehler
  620.   wurde behoben.
  621.  
  622. - Zusammenarbeit mit TOP verbessert:
  623.   1. XCC generiert Zeilen der Form ';loop Lx', mithilfe derer der TOP dann
  624.      (endlich) Loop-rotations machen kann.
  625.   2. XCC generiert Zeilen der Form ';ret [a|d]0', welche dem TOP dazu dienen,
  626.      mehr Optimierungen zu machen.
  627.   3. XCC generiert Zeilen der Form ';sstart' & ';send', welche dem TOP
  628.      anzeigen, daß hier Code für 'switches' steht, welcher umsortiert werden
  629.      soll
  630.   4. XCC generiert ';longs', wenn die '-L' Option angegeben wurde, dies ist
  631.      wichtig fuer die Register Parameter
  632.   5. XCC generiert ';notop' fuer alle Funktionen, die zwischen einem
  633.          '#pragma -TOP' und '#pragma +TOP'
  634.      stehen; das bedeutet, das TOP diese Funktionen nicht optimieren soll
  635.      (praktisch zum debuggen)
  636.   6. XCC generiert ';opt "<optionen-string>"', wenn eine Zeile
  637.          '#pragma OPT "<optionen-string>"
  638.      gefunden wird. Dies dient (aktuell nur) dazu, die Optionen fuer TOP
  639.      funktionenweise veraendern zu koennen
  640.   7. XCC generiert ';xhcc', um dem TOP anzuzeigen, das mit dem erweiterten
  641.      Compiler gearbeitet wird. TOP verwendet dies fuer die Behandlung der
  642.      ';ret' Direktive, um auch mit alten Versionendes Compilers lauffaehig
  643.      zu sein
  644.  
  645.  
  646. PREPROZESSOR:
  647. -------------
  648. - Das Macro __DATE__ wurde neu implementiert.
  649.  
  650. - Das Macro __TIME__ wurde neu implementiert.
  651.  
  652. - Dem Macro TOS wurde das Macro __TOS__ ergänzt, weil es anscheinend keine
  653.   einheitliche Schreibweise gibt, und ich dieses auch schon irgendwo gesehen
  654.   habe
  655.  
  656. - Es wurde ein Macro Namens __BASE_FILE__ implementiert, welches dem Benutzer
  657.   auch innerhalb von Include-Files die Möglichkeit gibt, auf den Namen der
  658.   Haupt-Datei zuzugreifen
  659.  
  660. - Das CPP-Kommando '#assert' wurde implementiert.
  661.   Syntax : #assert <ausdruck>
  662.   Wirkung: Falls <ausdruck> FALSE ist, erfolgt eine Fehlermeldung seitens des
  663.            Compilers und die Compilierung wird abgebrochen
  664.  
  665. - Das CPP-Kommando '#pragma' wurde implementiert.
  666.   Syntax : #pragma [+|-<NAME> ...] [irgendwas]
  667.       oder #pragma OPT "<string>"
  668.   Wirkung: dient zum Umschalten einiger Optionen;
  669.       #pragma +<name> schaltet die Option ein, durch '-<name>' wird sie
  670.       ausgeschaltet. Folgende Namen sind implementiert:
  671.       - PRO: Profiling                    ein/aus
  672.       - PTR: 'pointer types mismatch'     ein/aus
  673.       - CMP: 'cmp of diff ptrs'           ein/aus
  674.       - DIF: 'diff ptrs'                  ein/aus
  675.       - RDF: 'redefined: SYM'             ein/aus
  676.       - STR: String-Optimierung           ein/aus
  677.       - FST: Quick-Flag (Option '-q')     ein/aus
  678.       - TOP: Optimizer (funktionsweise)   ein/aus
  679.              (wird nur einmal pro Funktion ausgegeben)
  680.  
  681.       #pragma OPT "<string>" schreibt <string> in die Ausgabe-Datei.
  682.          Dies kann zum umschalten der Optionen des Optimizers je nach
  683.          zu optimierender Funktion verwendet werden.
  684.          Der String wird max. einmal pro Funktion ausgegeben!
  685.   Bisher gab es eine Fehlermeldung bei #pragma, was nicht Standard-Gemäß ist
  686.  
  687. - Das CPP-Kommando '#error' wurde implementiert.
  688.   Syntax : #error ["Meldung"]
  689.   Wirkung: Falls "Meldung" angegeben wird, so erfolgt die Ausgabe dieses
  690.            Strings als Fehlermeldung, ansonsten gibt es eine Standard-
  691.            Meldung und die Compilierung wird abgebrochen
  692.   Praktisch z.B., um auf Portierungs-Probleme hinzuweisen...
  693.  
  694. - Das CPP-Kommando #asm wird implementiert (noch in Arbeit...).
  695.   Syntax : #asm assembler-code
  696.   Wirkung: Funktioniert wie asm(), ist aber weniger Schreibkrams...
  697.            Funktioniert bedingt auch außerhalb von Funktionen.
  698.   Dieses ist zum gegenwärtigen Zeitpunkt nicht errreichbar, da die Implemen-
  699.   tierung noch nicht ganz abgeschlossen ist.
  700.  
  701.  
  702. OPTIONEN:
  703. ---------
  704. - Die neue Option '-Oname' bewirkt, daß die Assembler-Ausgaben in die Datei
  705.   <name> geschrieben wird, was insbesondere die Möglichkeit zur Laufwerks-
  706.   übergreifenden Compilierung bietet
  707.  
  708. - Die neue Option '-Ename' bewirkt, daß alle Meldungen des Compilers nicht
  709.   auf dem Bildschirm, sondern in die Datei <name> geschrieben werden
  710.  
  711. - Die neue Option -N bewirkt, daß Kommentare geschachtelt werden dürfen
  712.  
  713. - Die neue Option -Mzahl bewirkt, daß die Compilierung nach maximal <zahl>
  714.   Meldungen (errors, warnings) abgebrochen wird.
  715.  
  716. - Die neue Option -S bewirkt, daß mehrfach vorhandene Strings nicht mehr
  717.   zu einem zusammengefasst werden.
  718.  
  719. - Mit der neuen Option -T kann die Generierung der TRAP-Befehle abgeschaltet
  720.   werden (falls sich jemand eigene Funktionen gemdos(), bios() oder xbios()
  721.   schreiben will...). Siehe unten
  722.  
  723. - Die neue, von Detlev Würkner implementierte, und von uns korrigierte
  724.   Option -L bewirkt, daß alle als 'int' deklarierten Variablen 32Bits
  725.   groß sind (also int = long). Diese Option ist nur sehr wenig getestet,
  726.   also mit Vorsicht zu geniessen. Um sie nutzen zu können, müßten alle
  727.   Bibliotheken ebenfalls mit dieser Option neu übersetzt werden, wozu
  728.   ich natürlich keine Lust habe. Außerdem wird es Probleme mit den
  729.   direkten traps geben, da das Betriebs-System natürlich nach wie
  730.   vor auf 16Bit-Werten besteht.
  731.  
  732. - Mit der Option -X kann er Debug-Modus eingeschaltet werden. In diesem
  733.   Fall generiert der Compiler zusätzlichen Code, und im Falle eines Absturzes
  734.   meldet das Programm die Zeile und die Datei, in der der Fehler auftrat.
  735.   Dazu muß das Programm allerdings mit dem Startup-Code 'DEBUG_S.O' gelinkt
  736.   werden.
  737.   Die Syntax ist -X[N][function], wobei
  738.       N        den Debug-Level angibt, und
  739.       function den Namen einer Benutzer-Definierten Debug-Funktion
  740.   Aktuell sind die Levels 1 und 2 implementiert, bei Level 1 werden
  741.   die Zeilennummern generiert, sowie Aufrufe der angegebenen Funktion
  742.   am Anfang, am Ende und in jeder Schleife einer Funktion. In Level 2
  743.   wird pro Sourcecode-Zeile ein Aufruf der angegebenen Funktion generiert,
  744.   so daß im Prinzip ein Source-Level-Debugging moeglich ist. Eine dafür
  745.   geeignete Funktion liegt in einer ersten, unvollstaendigen Version bereits
  746.   bei: Sie heisst "_debug" und liegt in den Dateien DEBUG_A.O und DEBUG_C.O
  747.   vor, diese Dateien muessen beim Linken VOR den XDLibs angegeben werden.
  748.   Beim selberschreiben einer solchen Funktion ist auf jeden Fall zu beachten,
  749.   daß alle Register gerettet werden müssen, da dies beim Aufruf (natuerlich)
  750.   nicht geschieht.
  751.   Wenn die Angabe einer Debug-Funktion fehlt, sind Level 1 und 2 identisch.
  752.  
  753. - Die Kommandozeile hat somit folgendes Aussehen:
  754.   hcc [-DUIPNVMSLT] [-X[N][function]] [-OSFILE1] [-EERRFILE1] CFILE1 [...]
  755.   d.h. für jede Datei koennen eine eigene Fehlerdateien und (natürlich)
  756.   Ausgabedateien angegeben werden
  757.  
  758.  
  759.  
  760. SONSTIGE ERWEITERUNGEN:
  761. -----------------------
  762. - Variablen vom Typ 'void *' sind jetzt zu allen anderen Zeigern kompatibel,
  763.   d.h. bei Zuweisungen erfolgt keine Warnung mehr vom Compiler
  764.  
  765. - Bei Meldungen des Compilers, die sich auf ein Include-File beziehen, wird
  766.   jetzt der Zugriffs-Pfad mit ausgegeben
  767.  
  768. - In String-Konstanten können jetzt alle Umlaute und sonstigen Sonderzeichen
  769.   direkt angegeben werden. Bisher konnten diese Zeichen nur über die
  770.   Oktal-Notation '\XXX' ausgegeben werden.
  771.  
  772. - Die Multi-Byte-Characters wurden implementiert. Bisher wurden sie zwar ge-
  773.   duldet, d.h. nicht angemeckert, aber NICHT behandelt. Folgendes funktioniert
  774.   jetzt:
  775.       int  i = 'ab';
  776.       long j = 'abc';
  777.       long k = 'abcd';
  778.   Folgendes hingegen funktioniert (logischerweise) nicht:
  779.       short i = 'abc';
  780.   führt jedoch auch zu keiner Meldung vom Compiler ...
  781.  
  782. - Die String-Konkatenation wurde implementiert. Beispiel:
  783.    printf("Hello "   /* hier KEIN Komma */
  784.           "world");
  785.   führt zu keinem Fehler, sondern zur gewünschten Ausgabe "Hello world".
  786.   Diese Erweiterung kommt insbesondere der Lesbarkeit des Quelltextes
  787.   zugute, wenn lange Strings ausgegeben werden sollen. Außerdem spart sie
  788.   Arbeit beim portieren von ANSI-Quelltexten...
  789.  
  790. - Die Funktion asm() wurde dahingehend erweitert, daß jetzt ein einfacher
  791.   Zugriff auf alle Variablen möglich ist.
  792.   Beispiel: asm(" move.l   #1, <i>");
  793.       wird zu:    move.l   #1, REGISTER   falls i register-Variable ist
  794.       oder   :    move.l   #1, OFFSET(a6) falls i lokale Var oder Parameter ist
  795.       oder   :    move.l   #1, _i         falls i externe & globale Var ist
  796.       oder   :    move.l   #1, Lnummer    falls i statisch ist
  797.       oder   :    move.l   #1, <i>        falls i unbekannt ist
  798.  
  799. - Das Profiling wurde (endlich) implementiert, es tut sich jetzt also wirklich
  800.   etwas, wenn die Option '-P' in der Kommando-Zeile angegeben wird.
  801.   Am Anfang jeder Funktion wird der Aufruf einer Funktion Namens '_prolog'
  802.   eingefügt, welche in C folgendes Aussehen hat:
  803.       void _prolog(char *name)
  804.   <name> ist hierbei ein Zeiger auf den Namen der gerade ausgeführten Funktion
  805.   (z.B. "main")
  806.   Am Ende jeder Funktion wird der Aufruf einer Funktion Namens '_epilog'
  807.   eingefügt, welche in C folgendes Aussehen hat:
  808.       void _epilog(char *name)
  809.   wobei <name> wieder ein Zeiger auf den Namen der aktuellen Funktion ist.
  810.   Der Parameter wurde absichtlich über den Stack übergeben, damit auch alle
  811.   nicht-Assembler-Programmierer sich ihre eigenen Profiling-Funktionen
  812.   schreiben können. Damit die so erzeugte Tabelle auch ausgegeben wird, muß
  813.   beim Linken ein spezieller Startup-Code verwendet werden: 'prof_s.o'. Dieser
  814.   ruft direkt vor der Terminierung des Programmes eine Funktion Namens
  815.   '_saveprof' auf (in C: void _saveprof() ), welche die Tabelle in formatierter
  816.   Form in eine ASCII-Datei Namens 'prof.out' im aktuellen Verzeichnis schreibt.
  817.   Das ganze funktioniert somit natürlich nicht 100%ig, wenn in verschiedenen
  818.   Dateien statische Funktionen gleichen Namens verwendet werden...
  819.   Die zugehörigen Standard-Funktionen finden sich in der von uns modifizierten
  820.   Version der DLibs (sollte beiliegen, kann ansonsten bei uns bezogen werden).
  821.   Sollte das mit profiling übersetzte Programm abstürzen, dann nochmal über-
  822.   setzen, und zwar OHNE Optimizer...
  823.  
  824. - alle Aufrufe von gemdos(), bios() und xbios() werden jetzt direkt als
  825.   trap - Befehl erzeugt; aus einem 'jsr _gemdos' wird z.B. 'trap #1';
  826.   Die Vorteile:
  827.   - der trap - Befehl ist 2 Bytes lang, jsr dagegen 6
  828.   - der jsr-Befehl benötigt 20 Taktzyklen,
  829.     der rts-Befehl          16
  830.     der trap-Befehl         34
  831.                             --
  832.                             70 Taktzyklen plus dem, was da noch gemacht
  833.                                wird (Stack-Test, Rücksprung-Adresse vom
  834.                                und auf den Stack)
  835.    -> der direkte trap-Befehl ist somit mehr als doppelt so schnell in
  836.       der Ausführung und auch noch kürzer
  837.       (C-Desk ist z.B. mehr als 300 Bytes kürzer geworden)
  838.    Der Nachteil:
  839.    - kein Stack-overflow-Test mehr (tritt sowieso nie auf, es sei denn
  840.      durch einen Programmier-Fehler)
  841.    Abschaltbar durch '-T'.
  842.  
  843. - die Code-Erzeugung für 'switch' wurde wesentlich verbessert. Bisher konnte
  844.   es z.B. passieren, daß bei unglücklicher Wahl der 'case' - Werte aus einem
  845.   'switch' 4 gemacht wurden, was natürlich langsameren und längeren Code er-
  846.   zeugt, als ein 'switch'
  847.  
  848.  
  849. Sonstiges
  850. ---------
  851. - Erweiterungen/Änderungen gegenüber der Version 1.21 sind den übrigen Texten
  852.   zu entnehmen
  853. - alle von TETISOFT vogenommenen Änderungen sind ebenfalls in einem anderen
  854.   Text aufgeführt, jedoch größtenteils in der vorliegenden Version nicht oder
  855.   in modifizierter From enthalten.
  856.  
  857.  
  858.